package cn.hxsteel.storage.model.dao;

import java.io.Serializable;
import java.util.List;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Repository;

import cn.hxsteel.model.vo.PageVO;
import cn.hxsteel.storage.core.base.BaseDAO;
import cn.hxsteel.storage.core.config.constant.EHCacheNameConst;
import cn.hxsteel.storage.model.po.GoodsPO;
import cn.hxsteel.storage.model.vo.GoodsVO;
import cn.hxsteel.storage.module.goods.model.Goods1VO;
import cn.hxsteel.storage.module.goods.model.GoodsBO;

/**
 * 商品的数据访问对象
 */
@Repository
public class GoodsDAO extends BaseDAO< GoodsPO, Short >
{
    /**
     * 查询所有商品的持久对象的列表
     * 
     * @return
     */
    // @Cacheable( value = EHCacheNameConst.NOTOFTEN )
    public List< GoodsPO > selListAll()
    {
	return loadAll();
    }
    
    public GoodsVO selVO( Serializable goodsID )
    {
	List< GoodsVO > list = find( GoodsVO.class, "selVO", goodsID );
	if ( !list.isEmpty() ) { return list.get( 0 ); }
	return null;
    }
    
    public Goods1VO sel1VO( Serializable goodsID )
    {
	List< Goods1VO > list = find( Goods1VO.class, "sel1VO", goodsID );
	if ( !list.isEmpty() ) { return list.get( 0 ); }
	return null;
    }
    
    /**
     * 查询指定商品标识的持久对象
     * 
     * @param goodsID 商品标识
     * @return
     */
    @Cacheable( value = EHCacheNameConst.NOTOFTEN, key = "#goodsID + #key" )
    public GoodsPO selObj( Serializable goodsID, String key )
    {
	return load( goodsID );
    }
    
    /**
     * 修改PO
     * 
     * @param entity 实体类
     */
    @Caching( evict = { @CacheEvict( value = EHCacheNameConst.NOTOFTEN, key = "#entity.goodsID + #key" ) } )
    public void update( GoodsPO entity )
    {
	super.update( entity );
    }
    
    /**
     * 查询指定商品标识的持久对象
     * 
     * @param goodsID 商品标识
     * @return
     */
    public GoodsPO getObj( Serializable goodsID )
    {
	return get( goodsID );
    }
    
    /**
     * 按所有字段查询商品对象
     * 
     * @param name 品名
     * @param material 材质
     * @param origin 产地
     * @param norm 规格
     */
    public GoodsPO selObj( String name, String material, String origin, String norm )
    {
	return null;
	// return selProcObj( "p_Goods_obj", name, material, origin, norm );
    }
    
    /**
     * 查询是否存在商品对象
     */
    public GoodsPO selObj()
    {
	return null;
	// return selProcObj( "p_Goods_obj_sel" );
    }
    
    /**
     * 查询列出商品对象
     * 
     * @param name 商品名称
     */
    public List< GoodsPO > selListByname( String name )
    {
	return null;
	// return selProcList( "p_Goods_list_1", name );
    }
    
    /**
     * 查询列出商品对象
     * 
     * @param name 商品名称
     * @param material 材质
     */
    public List< GoodsPO > selListByNameAndMaterial( String name, String material )
    {
	return null;
	// return selProcList( "p_Goods_list_2", name, material );
    }
    
    /**
     * 返回商品总数量
     */
    public int selCount()
    {
	return -1;
	// return (Integer) selProcValue( "P_Goods_SelTotalNumber" );
    }
    
    /**
     * 分页查询商品
     * 
     * @param pageNo 页码
     * @param pageSize 每页多少条记录
     * @param name 商品名
     * @return
     */
    public PageVO< GoodsBO > selPageByName( int pageNo, int pageSize, String name, String material, String origin )
    {
	return null;
	// return (PageVO< GoodsBO >) selExProcPage( GoodsBO.class, "p_Goods_page", pageNo, pageSize, name, material,
	// origin );
    }
    
    /**
     * 通过商品ID查询商品信息
     * 
     * @param id 商品ID
     * @return
     */
    public GoodsPO selObjBy2( int id )
    {
	return null;
	// return selProcObj( "p_Goods_obj_sel_1", id );
    }
    
    /**
     * 查询完整的商品属性验证是否存在
     * 
     * @param id 商品ID
     * @param name 商品名
     * @param material 材质
     * @param origin 产地
     * @param norm 规格
     * @return
     */
    public GoodsPO selObjBy3( int id, String name, String material, String origin, String norm )
    {
	return null;
	// return selProcObj( "p_Goods_obj_sel_2", id, name, material, origin, norm );
    }
    
    /**
     * 先后按品名、材质、钢厂、规格查询出所有的记录
     * 
     * @return
     */
    public List< GoodsPO > selListOrderByGroup()
    {
	return null;
	// return selProcList( "p_Goods_list_3" );
    }
}